home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2006 February / Gamestar_81_2006-02_dvd.iso / Red Shark / Common / BaseMenu.script < prev    next >
Text File  |  2001-12-21  |  41KB  |  1,774 lines

  1. //-------------------------------------------------------------------
  2. //
  3. //  This code is copyright 2001 by G5 Software.
  4. //  Any unauthorized usage, either in part or in whole of this code
  5. //  is strictly prohibited. Violators WILL be prosecuted to the
  6. //  maximum extent allowed by law.
  7. //
  8. //-------------------------------------------------------------------
  9. //
  10. //  This script provides menu functionality
  11. //  that is used in both Game menu and Mission menu
  12.  
  13. //
  14. //  Base Menu
  15. //
  16.  
  17. class CBaseMenu extends CStrings
  18. {
  19.   // Menu initialization variables
  20.   // (variables read by menu component)
  21.  
  22.   string strSkinFile   = "Common/Menu.skin";
  23.   color  MenuTextNormalColor = color(0.7, 0.7, 0.7);
  24.   color  MenuTextHiliteColor = color(1.0, 0.0, 0.0);
  25.   string HiliteSoundScript = "CHiliteSound";
  26.   string SelectSoundScript = "CSelectSound";
  27.  
  28.   // video mode filter settings
  29.   int    MinAcceptedVideoModeWidth  = 640;
  30.   int    MinAcceptedVideoModeHeight = 480;
  31.   int    MinAcceptedVideoModeDepth  = 16;
  32.  
  33.   //
  34.   //  standard buttons
  35.   //
  36.  
  37.   float fStdButtonWidth        = 0.125;
  38.   float fStdButtonHeight       = 0.0412;
  39.  
  40.   float fScrollButtonWidth     = 0.031;
  41.   float fScrollButtonHeight    = 0.042;
  42.  
  43.   int   nBackButtonNormMat     = 48;
  44.   int   nBackButtonHiMat       = 49;
  45.  
  46.   int   nAcceptButtonNormMat   = 50;
  47.   int   nAcceptButtonHiMat     = 51;
  48.  
  49.   int   nStartButtonNormMat    = 58;
  50.   int   nStartButtonHiMat      = 59;
  51.  
  52.   int   nSettingsButtonNormMat = 54;
  53.   int   nSettingsButtonHiMat   = 55;
  54.  
  55.   int   nCreditsButtonNormMat  = 52;
  56.   int   nCreditsButtonHiMat    = 53;
  57.  
  58.   int   nQuitButtonNormMat     = 56;
  59.   int   nQuitButtonHiMat       = 57;
  60.  
  61.   int   nDownButtonNormMat     = 60;
  62.   int   nDownButtonHiMat       = 61;
  63.  
  64.   int   nUpButtonNormMat       = 62;
  65.   int   nUpButtonHiMat         = 63;
  66.  
  67.   // combo box helper method
  68.  
  69.   float BaseMenu_CreateCenteredComboBox(string _title, string _id, float _y, array _list, float _width)
  70.   {
  71.     _y =
  72.       CenterText(_title, _y, _id + "_TEXT", color(1.0, 1.0, 1.0));
  73.  
  74.     float fSpacing    = 0.02;
  75.     float fArrowWidth = 0.05;
  76.  
  77.     float LeftArrowX = (1.0 - _width) / 2 - fSpacing - fArrowWidth;
  78.     float RightArrowX = (1.0 - _width) / 2 + _width + fSpacing;
  79.  
  80.     //
  81.     //  left arrow
  82.     //
  83.  
  84.     CreateBitmapButton(
  85.       _id + "_LEFT_ARROW",
  86.       7,
  87.       8,
  88.       LeftArrowX,
  89.       _y,
  90.       fArrowWidth,
  91.       fButtonHeight);
  92.  
  93.     //
  94.     //  combo box
  95.     //
  96.  
  97.     CreateComboBox(
  98.       _list,
  99.       _id + "_COMBO_BOX",
  100.       (1.0 - _width) / 2,
  101.       _y,
  102.       _width,
  103.       fButtonHeight
  104.     );
  105.  
  106.     //
  107.     //  right arrow
  108.     //
  109.  
  110.     CreateBitmapButton(
  111.       _id + "_RIGHT_ARROW",
  112.       9,
  113.       10,
  114.       RightArrowX,
  115.       _y,
  116.       fArrowWidth,
  117.       fButtonHeight);
  118.  
  119.     return _y + fButtonHeight;
  120.   }
  121.  
  122.   //
  123.   //  Slider
  124.   //
  125.  
  126.   float BaseMenu_CreateCenteredSlider(
  127.      string _name,
  128.      string _sid,
  129.      float  _y,
  130.      float  _width
  131.     )
  132.   {
  133.     color  SliderColor        = color(1.0, 1.0, 1.0);
  134.     float  SliderX            = (1.0 - _width) / 2.0;
  135.     float  SliderCursorWidth  = 0.05;
  136.     float  SliderCursorHeight = 0.05 / 0.75;
  137.     float  SliderCursorMargin = SliderCursorWidth / 6.0;
  138.  
  139.     float y =
  140.       CenterText(_name, _y + fVertSpacing, "ID_SLIDER_TEXT", color(1.0, 1.0, 1.0));
  141.  
  142.     CreateSliderBack(
  143.       _sid + "_SLIDER_BACK",  // control id
  144.       SliderColor,           // color
  145.       SliderX,               // x
  146.       y,                     // y
  147.       _width,                // width
  148.       fButtonHeight          // height
  149.     );
  150.  
  151.     CreateSliderCursor(
  152.       _sid + "_SLIDER_CURSOR",      // control id
  153.       14,                           // normal material
  154.       15,                           // highlighted material
  155.       SliderX - SliderCursorMargin,                  // x
  156.       y + (fButtonHeight - SliderCursorHeight) / 2 + 0.003,  // y
  157.       SliderCursorWidth,            // width
  158.       SliderCursorHeight,           // height
  159.       SliderX + _width + SliderCursorMargin - SliderCursorWidth
  160.     );
  161.  
  162.     return y + fButtonHeight + fVertSpacing;
  163.   }
  164.  
  165.  
  166.   // attributes
  167.  
  168.   int    MenuWidth   = 10;
  169.   int    MenuSpacing = 5;
  170.  
  171.   float fButtonWidth  = 0.4;
  172.   float fButtonHeight = 0.07;
  173.   float fVertSpacing  = 0.01;
  174.  
  175.   float fPrevButtonWidth = 0.15;
  176.   float fNextButtonWidth = 0.15;
  177.  
  178.   // methods
  179.  
  180.   void CBaseMenu()
  181.   {
  182.   }
  183.  
  184.   //
  185.   //  Should be called by subclasses on move of menu button
  186.   //
  187.  
  188.   void BaseMenu_MenuButtonMoved(string _id)
  189.   {
  190.     if ("ID_GAMMA_CORRECTION_SLIDER_CURSOR" == _id)
  191.     {
  192.       float value = SendCommandToControl("ID_GAMMA_CORRECTION_SLIDER_CURSOR", "GET_VALUE");
  193.       SetGammaCorrection(value);
  194.     }
  195.   }
  196.  
  197.   //
  198.   //  Should be called by subclasses on user click on menu button
  199.   //
  200.  
  201.   void BaseMenu_MenuButtonClicked(string _id)
  202.   {
  203.     if ("ID_MISSION_STATUS_OK" == _id)
  204.     {
  205.       GoToRootMenu();
  206.  
  207.       // after debriefing -- go to select mission screen
  208.       if (!m_bInGame)
  209.         GoToSubMenu("GameMenu_InitMissionsMenu");
  210.  
  211.       Core_SendEventTo(SOID_MissionController, "OnHideMissionStatus");
  212.     }
  213.     else
  214.     if ("ID_MISSION_HELP_SCREEN_OK" == _id)
  215.     {
  216.       GoToRootMenu();
  217.       Core_SendEventTo(SOID_MissionController, "OnHideMissionHelpScreen");
  218.     }
  219.     else
  220.     if ("ID_CONTROLS_OK" == _id)
  221.     {
  222.       SaveControls("controls.settings");
  223.       GoToPrevMenu();
  224.     }
  225.     else
  226.     if ("ID_DEFAULT_CONTROLS_OK" == _id)
  227.     {
  228.       LoadControls("def_controls.settings");
  229.       GoToPrevMenu();
  230.     }
  231.     else
  232.     if ("ID_DEFAULT_WASD_CONTROLS_OK" == _id)
  233.     {
  234.       LoadControls("def_wasd_controls.settings");
  235.       GoToPrevMenu();
  236.     }
  237.     else
  238.     if ("ID_VIDEO_SETTINGS_OK" == _id)
  239.     {
  240.       // apply video mode settings
  241.       int device = SendCommandToControl("ID_VIDEO_CARD_COMBO_BOX", "GET_SELECTION");
  242.  
  243.       // apply video mode settings
  244.       int mode = SendCommandToControl("ID_VIDEO_MODE_COMBO_BOX", "GET_SELECTION");
  245.  
  246.       SetVideoMode(device, mode);
  247.  
  248.       // apply forest detail settings
  249.       float value = SendCommandToControl("ID_FOREST_DETAIL_SLIDER_CURSOR", "GET_VALUE");
  250.       SetForestDetail(value);
  251.  
  252.       // apply terrain detail settings
  253.       float value = SendCommandToControl("ID_TERRAIN_DETAIL_SLIDER_CURSOR", "GET_VALUE");
  254.       SetTerrainDetail(value);
  255.  
  256.       GoToPrevMenu();
  257.     }
  258.     else
  259.     if ("ID_MOUSE_SENSITIVITY_SLIDER_CURSOR" == _id)
  260.     {
  261.       float value = SendCommandToControl("ID_MOUSE_SENSITIVITY_SLIDER_CURSOR", "GET_VALUE");
  262.       SetMouseSensitivity(value);
  263.       SaveControls("controls.settings");
  264.     }
  265.     else
  266.     if ("ID_SOUND_VOLUME_SLIDER_CURSOR" == _id)
  267.     {
  268.       float value = SendCommandToControl("ID_SOUND_VOLUME_SLIDER_CURSOR", "GET_VALUE");
  269.       SetSoundFxVolume(value);
  270.       SaveSoundSettings();
  271.     }
  272.     else
  273.     if ("ID_MUSIC_VOLUME_SLIDER_CURSOR" == _id)
  274.     {
  275.       float value = SendCommandToControl("ID_MUSIC_VOLUME_SLIDER_CURSOR", "GET_VALUE");
  276.       SetMusicVolume(value);
  277.       SaveSoundSettings();
  278.     }
  279.  
  280.     if (Core_IsStringEndsWith(_id, "_LEFT_ARROW"))
  281.     {
  282.       // left combo box arrow
  283.  
  284.       string combo_id =
  285.         Core_GetStringPartPreceding(_id, "_LEFT_ARROW") + "_COMBO_BOX";
  286.  
  287.       SendCommandToControl(combo_id, "PREV");
  288.     }
  289.  
  290.     if (Core_IsStringEndsWith(_id, "_RIGHT_ARROW"))
  291.     {
  292.       // right combo box arrow
  293.  
  294.       string combo_id =
  295.         Core_GetStringPartPreceding(_id, "_RIGHT_ARROW") + "_COMBO_BOX";
  296.  
  297.       SendCommandToControl(combo_id, "NEXT");
  298.     }
  299.  
  300.     if (Core_IsStringStartsWith(_id, "ID_INPUT_DEVICE_"))
  301.     {
  302.       // input device switched
  303.       int device = SendCommandToControl("ID_INPUT_DEVICE_COMBO_BOX", "GET_SELECTION");
  304.       SetInputDevice(device);
  305.       SaveControls("controls.settings");
  306.     }
  307.  
  308.     if (Core_IsStringStartsWith(_id, "ID_DIFFICULTY_LEVEL_"))
  309.     {
  310.       // difficulty level switched
  311.       int level = SendCommandToControl("ID_DIFFICULTY_LEVEL_COMBO_BOX", "GET_SELECTION");
  312.       SetDifficultyLevel(level);
  313.     }
  314.  
  315.     if (Core_IsStringStartsWith(_id, "ID_VIDEO_CARD_"))
  316.     {
  317.       // video card switched - refresh video mode list
  318.       int device = SendCommandToControl("ID_VIDEO_CARD_COMBO_BOX", "GET_SELECTION");
  319.  
  320.       // replace array of modes in mode combo box
  321.       SendCommandToControl(
  322.         "ID_VIDEO_MODE_COMBO_BOX",
  323.         "SET_LIST",
  324.         GetVideoModesList(device)
  325.       );
  326.  
  327.       // try to find the equal mode in this list
  328.       SendCommandToControl(
  329.         "ID_VIDEO_MODE_COMBO_BOX",
  330.         "SET_SELECTION " + GetCurrentVideoModeIndex(device)
  331.       );
  332.     }
  333.  
  334.     if (Core_IsStringStartsWith(_id, "ID_TARGET_WINDOW_"))
  335.     {
  336.       int enabled = SendCommandToControl("ID_TARGET_WINDOW_COMBO_BOX", "GET_SELECTION");
  337.       Core_CallFunction("Helicopter",
  338.                         "EnableTargetScreen",
  339.                         enabled != 0);
  340.     }
  341.   }
  342.  
  343.   //
  344.   //  Submenus construction
  345.   //
  346.  
  347.   //
  348.   //  Settings menu
  349.   //
  350.  
  351.   void BaseMenu_InitSettingsBackground()
  352.   {
  353.     CreateBitmapControl(
  354.       "Resources/Menu_Settings.tex",
  355.       "ID_BITMAP",
  356.       0.0,
  357.       0.0,
  358.       1.0,
  359.       1.0
  360.     );
  361.   }
  362.  
  363.   void BaseMenu_InitSettingsMenu()
  364.   {
  365.     CreateMenuButtonGroup(MenuWidth, MenuSpacing);
  366.  
  367.     float fButtonX      = (1.0 - fButtonWidth) / 2;
  368.     float fButtonY      = 0.2;
  369.  
  370.     BaseMenu_InitSettingsBackground();
  371.  
  372.     //
  373.     //  Game settings button
  374.     //
  375.  
  376.     if (GetMenuType() == "GameMenu")
  377.     {
  378.       CreateSubMenu(
  379.           str_GameSettingsButton,
  380.           "ID_GAME_SETTINGS",
  381.           fButtonX,
  382.           fButtonY,
  383.           fButtonWidth,
  384.           fButtonHeight,
  385.           "BaseMenu_InitGameSettingsMenu");
  386.       fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  387.     }
  388.  
  389.     // video settings -- for game menu only
  390.  
  391.     //
  392.     //  Video settings button
  393.     //
  394.  
  395.     CreateSubMenu(
  396.         str_VideoSettingsButton,
  397.         "ID_VIDEO_SETTINGS",
  398.         fButtonX,
  399.         fButtonY,
  400.         fButtonWidth,
  401.         fButtonHeight,
  402.         "BaseMenu_InitVideoSettingsMenu");
  403.     fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  404.  
  405.     //
  406.     //  Audio settings button
  407.     //
  408.  
  409.     CreateSubMenu(
  410.       str_AudioSettingsButton,
  411.       "ID_AUDIO_SETTINGS",
  412.       fButtonX,
  413.       fButtonY,
  414.       fButtonWidth,
  415.       fButtonHeight,
  416.       "BaseMenu_InitAudioSettingsMenu");
  417.  
  418.     fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  419.  
  420.     //
  421.     //  Controls button
  422.     //
  423.  
  424.     CreateSubMenu(
  425.       str_ControlsButton,
  426.       "ID_CONTROLS",
  427.       fButtonX,
  428.       fButtonY,
  429.       fButtonWidth,
  430.       fButtonHeight,
  431.       "BaseMenu_InitControlsMenu");
  432.  
  433.     fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  434.  
  435.     //
  436.     //  Back button
  437.     //
  438.  
  439.     CreateTextButton(
  440.       str_BackButton,
  441.       "ID_BACK",
  442.       fButtonX,
  443.       fButtonY,
  444.       fButtonWidth,
  445.       fButtonHeight);
  446.  
  447.     fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  448.   }
  449.  
  450.   //
  451.   //  Game settings menu
  452.   //
  453.  
  454.   void BaseMenu_InitGameSettingsMenu()
  455.   {
  456.     BaseMenu_InitSettingsBackground();
  457.  
  458.     CreateMenuButtonGroup(MenuWidth, MenuSpacing);
  459.  
  460.     float fButtonX      = (1.0 - fButtonWidth) / 2;
  461.     float fButtonY      = 0.2;
  462.  
  463.     fButtonY =
  464.       BaseMenu_CreateCenteredComboBox(
  465.         str_DifficultyLevel,
  466.         "ID_DIFFICULTY_LEVEL",
  467.         fButtonY,
  468.           array(
  469.             str_Easy,
  470.             str_Medium,
  471.             str_Hard,
  472.             str_Nightmare
  473.           ),
  474.         0.5
  475.         );
  476.  
  477.     // display current difficulty level in combo box
  478.     SendCommandToControl(
  479.       "ID_DIFFICULTY_LEVEL_COMBO_BOX",
  480.       "SET_SELECTION " + GetDifficultyLevel()
  481.     );
  482.  
  483.     //
  484.     //  BACK button
  485.     //
  486.  
  487.     CreateTextButton(
  488.         str_BackButton,
  489.         "ID_BACK",
  490.         fButtonX,
  491.         fButtonY,
  492.         fButtonWidth,
  493.         fButtonHeight);
  494.  
  495.     fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  496.   }
  497.  
  498.   //
  499.   //  Video settings menu
  500.   //
  501.  
  502.   void BaseMenu_InitVideoSettingsMenu()
  503.   {
  504.     BaseMenu_InitSettingsBackground();
  505.  
  506.     CreateMenuButtonGroup(MenuWidth, MenuSpacing);
  507.  
  508.     float fButtonX      = (1.0 - fButtonWidth) / 2;
  509.     float fButtonY      = 0.2;
  510.  
  511.     //
  512.     //  for mission menu disable background to let player see
  513.     //  how gamma correction affects game picture
  514.     //
  515.  
  516.     if (GetMenuType() == "MissionMenu")
  517.     {
  518.       DisableBackgroundForThisMenu();
  519.     }
  520.  
  521.     //
  522.     //  video modes and forest detail for game menu only
  523.     //
  524.  
  525.     if (GetMenuType() == "GameMenu")
  526.     {
  527.       fButtonY =
  528.         BaseMenu_CreateCenteredComboBox(
  529.           str_SelectVideoDevice,
  530.           "ID_VIDEO_CARD",
  531.           fButtonY,
  532.           GetVideoDevicesList(),
  533.           0.5
  534.         );
  535.  
  536.       // display current device in video device combo box
  537.       SendCommandToControl(
  538.         "ID_VIDEO_CARD_COMBO_BOX",
  539.         "SET_SELECTION " + GetCurrentVideoDeviceIndex()
  540.       );
  541.  
  542.       fButtonY = fButtonY + fVertSpacing;
  543.  
  544.       fButtonY =
  545.         BaseMenu_CreateCenteredComboBox(
  546.           str_SelectVideoMode,
  547.           "ID_VIDEO_MODE",
  548.           fButtonY,
  549.           GetVideoModesList(GetCurrentVideoDeviceIndex()),
  550.           0.5
  551.         );
  552.  
  553.       // display current video mode in video mode combo box
  554.       SendCommandToControl(
  555.         "ID_VIDEO_MODE_COMBO_BOX",
  556.         "SET_SELECTION " + GetCurrentVideoModeIndex(GetCurrentVideoDeviceIndex())
  557.       );
  558.  
  559.       fButtonY = fButtonY + fVertSpacing;
  560.     }
  561.  
  562.     //
  563.     //  Gamma correction slider
  564.     //
  565.  
  566.     if (IsGammaCorrectionAvailable())
  567.     {
  568.  
  569.       fButtonY =
  570.         BaseMenu_CreateCenteredSlider(
  571.           str_GammaCorrectionTitle,
  572.           "ID_GAMMA_CORRECTION",
  573.           fButtonY,
  574.           0.5
  575.         );
  576.  
  577.       SendCommandToControl(
  578.         "ID_GAMMA_CORRECTION_SLIDER_CURSOR",
  579.         "SET_VALUE " + GetGammaCorrection()
  580.       );
  581.  
  582.       fButtonY = fButtonY + fVertSpacing;
  583.     }
  584.  
  585.     if (GetMenuType() == "MissionMenu")
  586.     {
  587.       //
  588.       //  Target window combo box
  589.       //
  590.  
  591.       fButtonY =
  592.         BaseMenu_CreateCenteredComboBox(
  593.           str_TargetWindowTitle,
  594.           "ID_TARGET_WINDOW",
  595.           fButtonY,
  596.           array(str_Off, str_On),
  597.           0.5
  598.         );
  599.  
  600.       bool bEnabled = Core_CallFunction("Helicopter",
  601.                                         "IsTargetScreenEnabled");
  602.  
  603.       int init_value = 0;
  604.       if (bEnabled) init_value = 1;
  605.  
  606.       // display current device in video device combo box
  607.       SendCommandToControl(
  608.         "ID_TARGET_WINDOW_COMBO_BOX",
  609.         "SET_SELECTION " + init_value
  610.       );
  611.  
  612.       fButtonY = fButtonY + fVertSpacing;
  613.     }
  614.  
  615.     if (GetMenuType() == "GameMenu")
  616.     {
  617.       //
  618.       //  Forest detail slider
  619.       //
  620.  
  621.       fButtonY =
  622.         BaseMenu_CreateCenteredSlider(
  623.           str_ForestDetailTitle,
  624.           "ID_FOREST_DETAIL",
  625.           fButtonY,
  626.           0.5
  627.         );
  628.  
  629.       SendCommandToControl(
  630.         "ID_FOREST_DETAIL_SLIDER_CURSOR",
  631.         "SET_VALUE " + GetForestDetail()
  632.       );
  633.  
  634.       fButtonY = fButtonY + fVertSpacing;
  635.  
  636.       //
  637.       //  Terrain detail slider
  638.       //
  639.  
  640.       fButtonY =
  641.         BaseMenu_CreateCenteredSlider(
  642.           str_TerrainDetailTitle,
  643.           "ID_TERRAIN_DETAIL",
  644.           fButtonY,
  645.           0.5
  646.         );
  647.  
  648.       SendCommandToControl(
  649.         "ID_TERRAIN_DETAIL_SLIDER_CURSOR",
  650.         "SET_VALUE " + GetTerrainDetail()
  651.       );
  652.  
  653.       fButtonY = fButtonY + fVertSpacing;
  654.     }
  655.  
  656.     if (GetMenuType() == "MissionMenu")
  657.     {
  658.       //
  659.       //  BACK button
  660.       //
  661.  
  662.       CreateTextButton(
  663.           str_BackButton,
  664.           "ID_BACK",
  665.           fButtonX,
  666.           fButtonY,
  667.           fButtonWidth,
  668.           fButtonHeight);
  669.     }
  670.     else
  671.     {
  672.       //
  673.       //  OK button
  674.       //
  675.  
  676.       CreateTextButton(
  677.           str_OkButton,
  678.           "ID_VIDEO_SETTINGS_OK",
  679.           fButtonX,
  680.           fButtonY,
  681.           fButtonWidth,
  682.           fButtonHeight);
  683.  
  684.       fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  685.  
  686.       //
  687.       //  CANCEL button
  688.       //
  689.  
  690.       CreateTextButton(
  691.           str_CancelButton,
  692.           "ID_BACK",
  693.           fButtonX,
  694.           fButtonY,
  695.           fButtonWidth,
  696.           fButtonHeight);
  697.  
  698.       fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  699.     }
  700.   }
  701.  
  702.   //
  703.   //  Audio settings menu
  704.   //
  705.  
  706.   void BaseMenu_InitAudioSettingsMenu()
  707.   {
  708.     BaseMenu_InitSettingsBackground();
  709.  
  710.     CreateMenuButtonGroup(MenuWidth, MenuSpacing);
  711.  
  712.     float fButtonX      = (1.0 - fButtonWidth) / 2;
  713.     float fButtonY      = 0.2;
  714.  
  715.     //
  716.     //  Sound fx volume
  717.     //
  718.  
  719.     fButtonY =
  720.       BaseMenu_CreateCenteredSlider(
  721.         str_SoundVolumeTitle,
  722.         "ID_SOUND_VOLUME",
  723.         fButtonY,
  724.         0.5
  725.       );
  726.  
  727.     SendCommandToControl(
  728.       "ID_SOUND_VOLUME_SLIDER_CURSOR",
  729.       "SET_VALUE " + GetSoundFxVolume()
  730.     );
  731.  
  732.     fButtonY = fButtonY + fVertSpacing;
  733.  
  734.     //
  735.     //  Music volume
  736.     //
  737.  
  738.     fButtonY =
  739.       BaseMenu_CreateCenteredSlider(
  740.         str_MusicVolumeTitle,
  741.         "ID_MUSIC_VOLUME",
  742.         fButtonY,
  743.         0.5
  744.       );
  745.  
  746.     SendCommandToControl(
  747.       "ID_MUSIC_VOLUME_SLIDER_CURSOR",
  748.       "SET_VALUE " + GetMusicVolume()
  749.     );
  750.  
  751.     fButtonY = fButtonY + fVertSpacing;
  752.  
  753.     //
  754.     //  Back button
  755.     //
  756.  
  757.     CreateTextButton(
  758.         str_BackButton,
  759.         "ID_BACK",
  760.         fButtonX,
  761.         fButtonY,
  762.         fButtonWidth,
  763.         fButtonHeight);
  764.  
  765.     fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  766.   }
  767.  
  768.   //
  769.   //  Controls menu
  770.   //
  771.  
  772.   void BaseMenu_InitControlsMenu()
  773.   {
  774.     BaseMenu_InitSettingsBackground();
  775.  
  776.     CreateMenuButtonGroup(MenuWidth, MenuSpacing);
  777.  
  778.     float fButtonX      = (1.0 - fButtonWidth) / 2;
  779.     float fButtonY      = 0.2;
  780.  
  781.     array devices;
  782.  
  783.     if (IsJoystickAvailable())
  784.       devices =
  785.         array(
  786.           str_Mouse,
  787.           str_Joystick
  788.         );
  789.     else
  790.       devices =
  791.         array(
  792.           str_Mouse
  793.         );
  794.  
  795.     fButtonY =
  796.       BaseMenu_CreateCenteredComboBox(
  797.         str_SelectInputDevice,
  798.         "ID_INPUT_DEVICE",
  799.         fButtonY,
  800.         devices,
  801.         0.5
  802.       );
  803.  
  804.     fButtonY = fButtonY + fVertSpacing;
  805.  
  806.     // display currently selected device in combo box
  807.     SendCommandToControl(
  808.       "ID_INPUT_DEVICE_COMBO_BOX",
  809.       "SET_SELECTION " + GetInputDevice()
  810.     );
  811.  
  812.     //
  813.     //  Movement controls button
  814.     //
  815.  
  816.     CreateSubMenu(
  817.       str_MovementButton,
  818.       "ID_MOVEMENT_CONTROLS",
  819.       fButtonX,
  820.       fButtonY,
  821.       fButtonWidth,
  822.       fButtonHeight,
  823.       "BaseMenu_InitMovementControlsMenu"
  824.     );
  825.  
  826.     fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  827.  
  828.     //
  829.     //  Fire controls button
  830.     //
  831.  
  832.     CreateSubMenu(
  833.       str_FireButton,
  834.       "ID_FIRE_CONTROLS",
  835.       fButtonX,
  836.       fButtonY,
  837.       fButtonWidth,
  838.       fButtonHeight,
  839.       "BaseMenu_InitFireControlsMenu"
  840.     );
  841.  
  842.     fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  843.  
  844.     //
  845.     //  Other controls button
  846.     //
  847.  
  848.     CreateSubMenu(
  849.       str_OtherButton,
  850.       "ID_OTHER_CONTROLS",
  851.       fButtonX,
  852.       fButtonY,
  853.       fButtonWidth,
  854.       fButtonHeight,
  855.       "BaseMenu_InitOtherControlsMenu"
  856.     );
  857.  
  858.     fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  859.  
  860.     //
  861.     //  Default arrow controls button
  862.     //
  863.  
  864.     CreateSubMenu(
  865.       str_SetDefaultButton,
  866.       "ID_DEFAULT_CONTROLS",
  867.       fButtonX,
  868.       fButtonY,
  869.       fButtonWidth,
  870.       fButtonHeight,
  871.       "BaseMenu_InitDefaultControlsMenu"
  872.     );
  873.  
  874.     fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  875.  
  876.     CreateSubMenu(
  877.       str_SetWASDDefaultButton,
  878.       "ID_DEFAULT_WASD_CONTROLS",
  879.       fButtonX,
  880.       fButtonY,
  881.       fButtonWidth,
  882.       fButtonHeight,
  883.       "BaseMenu_InitDefaultWASDControlsMenu"
  884.     );
  885.  
  886.     fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  887.  
  888.     //
  889.     //  Mouse sensitivity slider
  890.     //
  891.  
  892.     fButtonY =
  893.       BaseMenu_CreateCenteredSlider(
  894.         str_MouseSensitivityTitle,
  895.         "ID_MOUSE_SENSITIVITY",
  896.         fButtonY,
  897.         0.5
  898.       );
  899.  
  900.     SendCommandToControl(
  901.       "ID_MOUSE_SENSITIVITY_SLIDER_CURSOR",
  902.       "SET_VALUE " + GetMouseSensitivity()
  903.     );
  904.  
  905.     fButtonY = fButtonY + fVertSpacing;
  906.  
  907.     //
  908.     //  Back button
  909.     //
  910.  
  911.     CreateTextButton(
  912.       str_BackButton,
  913.       "ID_BACK",
  914.       fButtonX,
  915.       fButtonY,
  916.       fButtonWidth,
  917.       fButtonHeight
  918.     );
  919.   }
  920.  
  921.   void BaseMenu_InitDefaultControlsMenu()
  922.   {
  923.     BaseMenu_InitSettingsBackground();
  924.  
  925.     CreateMenuButtonGroup(MenuWidth, MenuSpacing);
  926.  
  927.     float y =
  928.       CenterText(str_APPLY_DEFAULT_SETTINGS, 0.3, "ID_TITLE_TEXT", color(1.0, 1.0, 1.0));
  929.  
  930.     float fButtonY = y + fVertSpacing * 2;
  931.     float fButtonX = (1.0 - fButtonWidth) / 2;
  932.  
  933.     //
  934.     //  YES button
  935.     //
  936.  
  937.     CreateTextButton(
  938.       str_YesButton,
  939.       "ID_DEFAULT_CONTROLS_OK",
  940.       fButtonX,
  941.       fButtonY,
  942.       fButtonWidth,
  943.       fButtonHeight
  944.     );
  945.  
  946.     fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  947.  
  948.     //
  949.     //  NO button
  950.     //
  951.  
  952.     CreateTextButton(
  953.       str_NoButton,
  954.       "ID_BACK",
  955.       fButtonX,
  956.       fButtonY,
  957.       fButtonWidth,
  958.       fButtonHeight
  959.     );
  960.   }
  961.  
  962.   void BaseMenu_InitDefaultWASDControlsMenu()
  963.   {
  964.     BaseMenu_InitSettingsBackground();
  965.  
  966.     CreateMenuButtonGroup(MenuWidth, MenuSpacing);
  967.  
  968.     float y =
  969.       CenterText(str_APPLY_DEFAULT_SETTINGS, 0.3, "ID_TITLE_TEXT", color(1.0, 1.0, 1.0));
  970.  
  971.     float fButtonY = y + fVertSpacing * 2;
  972.     float fButtonX = (1.0 - fButtonWidth) / 2;
  973.  
  974.     //
  975.     //  YES button
  976.     //
  977.  
  978.     CreateTextButton(
  979.       str_YesButton,
  980.       "ID_DEFAULT_WASD_CONTROLS_OK",
  981.       fButtonX,
  982.       fButtonY,
  983.       fButtonWidth,
  984.       fButtonHeight
  985.     );
  986.  
  987.     fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  988.  
  989.     //
  990.     //  NO button
  991.     //
  992.  
  993.     CreateTextButton(
  994.       str_NoButton,
  995.       "ID_BACK",
  996.       fButtonX,
  997.       fButtonY,
  998.       fButtonWidth,
  999.       fButtonHeight
  1000.     );
  1001.   }
  1002.  
  1003.   //
  1004.   //  Key binding helper methods
  1005.   //
  1006.  
  1007.   string GetCommandName(
  1008.       int _Command
  1009.     )
  1010.   {
  1011.     if (CTLCMD_FORWARD == _Command)             return str_FORWARD;
  1012.     if (CTLCMD_BACKWARD == _Command)            return str_BACKWARD;
  1013.     if (CTLCMD_LEFT == _Command)                return str_LEFT;
  1014.     if (CTLCMD_RIGHT == _Command)               return str_RIGHT;
  1015.     if (CTLCMD_UP == _Command)                  return str_UP;
  1016.     if (CTLCMD_DOWN == _Command)                return str_DOWN;
  1017.     if (CTLCMD_FIRE == _Command)                return str_FIRE;
  1018.     if (CTLCMD_LAUNCH == _Command)              return str_LAUNCH;
  1019.     if (CTLCMD_INCSPEED == _Command)            return str_INCSPEED;
  1020.     if (CTLCMD_DECSPEED == _Command)            return str_DECSPEED;
  1021.     if (CTLCMD_MAXSPEED == _Command)            return str_MAXSPEED;
  1022.     if (CTLCMD_STOP == _Command)                return str_STOP;
  1023.     if (CTLCMD_NEXT_TARGET == _Command)         return str_NEXT_TARGET;
  1024.     if (CTLCMD_NEAREST_TARGET == _Command)      return str_NEAREST_TARGET;
  1025.     if (CTLCMD_NEXT_NAVPOINT == _Command)       return str_NEXT_NAVPOINT;
  1026.     if (CTLCMD_VIKHR_LAUNCHER == _Command)      return str_VIKHR_LAUNCHER;
  1027.     if (CTLCMD_S8_LAUNCHER == _Command)         return str_S8_LAUNCHER;
  1028.     if (CTLCMD_CLEAR_SCREEN == _Command)        return str_CLEAR_SCREEN;
  1029.     if (CTLCMD_SHOW_MISSION_STATUS == _Command) return str_SHOW_MISSION_STATUS;
  1030.     if (CTLCMD_SHOW_TARGET == _Command)         return str_SHOW_TARGET;
  1031.     if (CTLCMD_MAP_ZOOM_IN == _Command)         return str_MAP_ZOOM_IN;
  1032.     if (CTLCMD_MAP_ZOOM_OUT == _Command)        return str_MAP_ZOOM_OUT;
  1033.     if (CTLCMD_NEXT_CAMERA_VIEW == _Command)    return str_NEXT_CAMERA_VIEW;
  1034.     if (CTLCMD_DEFAULT_CAMERA_VIEW == _Command) return str_DEFAULT_CAMERA_VIEW;
  1035.     if (CTLCMD_TOGGLE_FULLSCREEN_TARGET == _Command)
  1036.      return str_TOGGLE_FULLSCREEN_TARGET;
  1037.     if (CTLCMD_TOGGLE_COCKPIT_COLOR == _Command)
  1038.      return str_TOGGLE_COCKPIT_COLOR;
  1039.  
  1040.     return "UNKNWOWN";
  1041.   }
  1042.  
  1043.   float BaseMenu_CreateBindingControl(float _y, int _cmd, string _id_text, string _id_ctl)
  1044.   {
  1045.     float fSpacing   = 0.05;
  1046.     float fTextWidth = 0.5;
  1047.     color fTextColor = color(1.0, 1.0, 1.0);
  1048.  
  1049.     string text = GetCommandName(_cmd);
  1050.  
  1051.     CreateTextControl(
  1052.       text,
  1053.       _id_text,
  1054.             fSpacing,
  1055.             _y + (fButtonHeight - GetTextHeight(text))/2,
  1056.             fTextWidth,
  1057.             fButtonHeight,
  1058.       color(1.0, 1.0, 1.0)
  1059.           );
  1060.  
  1061.     CreateKeyButton(
  1062.       _id_ctl,
  1063.       _cmd,
  1064.       fSpacing + fTextWidth + fSpacing,
  1065.       _y,
  1066.       fButtonWidth,
  1067.       fButtonHeight
  1068.     );
  1069.  
  1070.     return _y + fButtonHeight + fVertSpacing;
  1071.   }
  1072.  
  1073.   //
  1074.   //  Movement controls screen
  1075.   //
  1076.  
  1077.   void BaseMenu_InitMovementControlsMenu()
  1078.   {
  1079.     BaseMenu_InitSettingsBackground();
  1080.  
  1081.     CreateMenuButtonGroup(MenuWidth, MenuSpacing);
  1082.  
  1083.     float fButtonX      = (1.0 - fButtonWidth) / 2;
  1084.     float fButtonY      = 0.05;
  1085.  
  1086.     fButtonY =
  1087.     BaseMenu_CreateBindingControl(
  1088.       fButtonY,
  1089.       CTLCMD_FORWARD,
  1090.       "CTLCMD_FORWARD_TEXT",
  1091.       "CTLCMD_FORWARD_CTRL"
  1092.     );
  1093.  
  1094.     fButtonY =
  1095.     BaseMenu_CreateBindingControl(
  1096.       fButtonY,
  1097.       CTLCMD_BACKWARD,
  1098.       "CTLCMD_BACKWARD_TEXT",
  1099.       "CTLCMD_BACKWARD_CTRL"
  1100.     );
  1101.  
  1102.     fButtonY =
  1103.     BaseMenu_CreateBindingControl(
  1104.       fButtonY,
  1105.       CTLCMD_LEFT,
  1106.       "CTLCMD_LEFT_TEXT",
  1107.       "CTLCMD_LEFT_CTRL"
  1108.     );
  1109.  
  1110.     fButtonY =
  1111.     BaseMenu_CreateBindingControl(
  1112.       fButtonY,
  1113.       CTLCMD_RIGHT,
  1114.       "CTLCMD_RIGHT_TEXT",
  1115.       "CTLCMD_RIGHT_CTRL"
  1116.     );
  1117.  
  1118.     fButtonY =
  1119.     BaseMenu_CreateBindingControl(
  1120.       fButtonY,
  1121.       CTLCMD_UP,
  1122.       "CTLCMD_UP_TEXT",
  1123.       "CTLCMD_UP_CTRL"
  1124.     );
  1125.  
  1126.     fButtonY =
  1127.     BaseMenu_CreateBindingControl(
  1128.       fButtonY,
  1129.       CTLCMD_DOWN,
  1130.       "CTLCMD_DOWN_TEXT",
  1131.       "CTLCMD_DOWN_CTRL"
  1132.     );
  1133.  
  1134.     fButtonY =
  1135.     BaseMenu_CreateBindingControl(
  1136.       fButtonY,
  1137.       CTLCMD_INCSPEED,
  1138.       "CTLCMD_INCSPEED_TEXT",
  1139.       "CTLCMD_INCSPEED_CTRL"
  1140.     );
  1141.  
  1142.     fButtonY =
  1143.     BaseMenu_CreateBindingControl(
  1144.       fButtonY,
  1145.       CTLCMD_DECSPEED,
  1146.       "CTLCMD_DECSPEED_TEXT",
  1147.       "CTLCMD_DECSPEED_CTRL"
  1148.     );
  1149.  
  1150.     fButtonY =
  1151.     BaseMenu_CreateBindingControl(
  1152.       fButtonY,
  1153.       CTLCMD_MAXSPEED,
  1154.       "CTLCMD_MAXSPEED_TEXT",
  1155.       "CTLCMD_MAXSPEED_CTRL"
  1156.     );
  1157.  
  1158.     fButtonY =
  1159.     BaseMenu_CreateBindingControl(
  1160.       fButtonY,
  1161.       CTLCMD_STOP,
  1162.       "CTLCMD_STOP_TEXT",
  1163.       "CTLCMD_STOP_CTRL"
  1164.     );
  1165.  
  1166.     fButtonY = fButtonY + fVertSpacing;
  1167.  
  1168.     //
  1169.     //  OK button
  1170.     //
  1171.  
  1172.     CreateTextButton(
  1173.       str_OkButton,
  1174.       "ID_CONTROLS_OK",
  1175.       fButtonX,
  1176.       fButtonY,
  1177.       fButtonWidth,
  1178.       fButtonHeight
  1179.     );
  1180.  
  1181.     fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  1182.   }
  1183.  
  1184.   //
  1185.   //  Fire controls screen
  1186.   //
  1187.  
  1188.   void BaseMenu_InitFireControlsMenu()
  1189.   {
  1190.     BaseMenu_InitSettingsBackground();
  1191.  
  1192.     CreateMenuButtonGroup(MenuWidth, MenuSpacing);
  1193.  
  1194.     float fButtonX      = (1.0 - fButtonWidth) / 2;
  1195.     float fButtonY      = 0.05;
  1196.  
  1197.     fButtonY =
  1198.     BaseMenu_CreateBindingControl(
  1199.       fButtonY,
  1200.       CTLCMD_FIRE,
  1201.       "CTLCMD_FIRE_TEXT",
  1202.       "CTLCMD_FIRE_CTRL"
  1203.     );
  1204.  
  1205.     fButtonY =
  1206.     BaseMenu_CreateBindingControl(
  1207.       fButtonY,
  1208.       CTLCMD_LAUNCH,
  1209.       "CTLCMD_LAUNCH_TEXT",
  1210.       "CTLCMD_LAUNCH_CTRL"
  1211.     );
  1212.  
  1213.     fButtonY =
  1214.     BaseMenu_CreateBindingControl(
  1215.       fButtonY,
  1216.       CTLCMD_NEXT_TARGET,
  1217.       "CTLCMD_NEXT_TARGET_TEXT",
  1218.       "CTLCMD_NEXT_TARGET_CTRL"
  1219.     );
  1220.  
  1221.     fButtonY =
  1222.     BaseMenu_CreateBindingControl(
  1223.       fButtonY,
  1224.       CTLCMD_NEAREST_TARGET,
  1225.       "CTLCMD_NEAREST_TARGET_TEXT",
  1226.       "CTLCMD_NEAREST_TARGET_CTRL"
  1227.     );
  1228.  
  1229.     fButtonY =
  1230.     BaseMenu_CreateBindingControl(
  1231.       fButtonY,
  1232.       CTLCMD_VIKHR_LAUNCHER,
  1233.       "CTLCMD_VIKHR_LAUNCHER_TEXT",
  1234.       "CTLCMD_VIKHR_LAUNCHER_CTRL"
  1235.     );
  1236.  
  1237.     fButtonY =
  1238.     BaseMenu_CreateBindingControl(
  1239.       fButtonY,
  1240.       CTLCMD_S8_LAUNCHER,
  1241.       "CTLCMD_S8_LAUNCHER_TEXT",
  1242.       "CTLCMD_S8_LAUNCHER_CTRL"
  1243.     );
  1244.  
  1245.     fButtonY = fButtonY + fVertSpacing;
  1246.  
  1247.     //
  1248.     //  OK button
  1249.     //
  1250.  
  1251.     CreateTextButton(
  1252.       str_OkButton,
  1253.       "ID_CONTROLS_OK",
  1254.       fButtonX,
  1255.       fButtonY,
  1256.       fButtonWidth,
  1257.       fButtonHeight
  1258.     );
  1259.  
  1260.     fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  1261.   }
  1262.  
  1263.   //
  1264.   //  Other controls screen
  1265.   //
  1266.  
  1267.   void BaseMenu_InitOtherControlsMenu()
  1268.   {
  1269.     BaseMenu_InitSettingsBackground();
  1270.  
  1271.     CreateMenuButtonGroup(MenuWidth, MenuSpacing);
  1272.  
  1273.     float fButtonX      = (1.0 - fButtonWidth) / 2;
  1274.     float fButtonY      = 0.05;
  1275.  
  1276.     fButtonY =
  1277.     BaseMenu_CreateBindingControl(
  1278.       fButtonY,
  1279.       CTLCMD_NEXT_NAVPOINT,
  1280.       "CTLCMD_NEXT_NAVPOINT_TEXT",
  1281.       "CTLCMD_NEXT_NAVPOINT_CTRL"
  1282.     );
  1283.  
  1284.     fButtonY =
  1285.     BaseMenu_CreateBindingControl(
  1286.       fButtonY,
  1287.       CTLCMD_CLEAR_SCREEN,
  1288.       "CTLCMD_CLEAR_SCREEN_TEXT",
  1289.       "CTLCMD_CLEAR_SCREEN_CTRL"
  1290.     );
  1291.  
  1292.     fButtonY =
  1293.     BaseMenu_CreateBindingControl(
  1294.       fButtonY,
  1295.       CTLCMD_SHOW_TARGET,
  1296.       "CTLCMD_SHOW_TARGET_TEXT",
  1297.       "CTLCMD_SHOW_TARGET_CTRL"
  1298.     );
  1299.  
  1300.     fButtonY =
  1301.     BaseMenu_CreateBindingControl(
  1302.       fButtonY,
  1303.       CTLCMD_MAP_ZOOM_IN,
  1304.       "CTLCMD_MAP_ZOOM_IN_TEXT",
  1305.       "CTLCMD_MAP_ZOOM_IN_CTRL"
  1306.     );
  1307.  
  1308.     fButtonY =
  1309.     BaseMenu_CreateBindingControl(
  1310.       fButtonY,
  1311.       CTLCMD_MAP_ZOOM_OUT,
  1312.       "CTLCMD_MAP_ZOOM_OUT_TEXT",
  1313.       "CTLCMD_MAP_ZOOM_OUT_CTRL"
  1314.     );
  1315.  
  1316.     fButtonY =
  1317.     BaseMenu_CreateBindingControl(
  1318.       fButtonY,
  1319.       CTLCMD_NEXT_CAMERA_VIEW,
  1320.       "CTLCMD_NEXT_CAMERA_VIEW",
  1321.       "CTLCMD_NEXT_CAMERA_VIEW"
  1322.     );
  1323.  
  1324.     fButtonY =
  1325.     BaseMenu_CreateBindingControl(
  1326.       fButtonY,
  1327.       CTLCMD_DEFAULT_CAMERA_VIEW,
  1328.       "CTLCMD_DEFAULT_CAMERA_VIEW",
  1329.       "CTLCMD_DEFAULT_CAMERA_VIEW"
  1330.     );
  1331.  
  1332.     fButtonY =
  1333.     BaseMenu_CreateBindingControl(
  1334.       fButtonY,
  1335.       CTLCMD_TOGGLE_FULLSCREEN_TARGET,
  1336.       "CTLCMD_TOGGLE_FULLSCREEN_TARGET",
  1337.       "CTLCMD_TOGGLE_FULLSCREEN_TARGET"
  1338.     );
  1339.  
  1340.     fButtonY = fButtonY + fVertSpacing;
  1341.  
  1342.     fButtonY =
  1343.     BaseMenu_CreateBindingControl(
  1344.       fButtonY,
  1345.       CTLCMD_TOGGLE_COCKPIT_COLOR,
  1346.       "CTLCMD_TOGGLE_COCKPIT_COLOR",
  1347.       "CTLCMD_TOGGLE_COCKPIT_COLOR"
  1348.     );
  1349.  
  1350.     fButtonY = fButtonY + fVertSpacing;
  1351.  
  1352.     //
  1353.     //  Back button
  1354.     //
  1355.  
  1356.     CreateTextButton(
  1357.       str_OkButton,
  1358.       "ID_CONTROLS_OK",
  1359.       fButtonX,
  1360.       fButtonY,
  1361.       fButtonWidth,
  1362.       fButtonHeight
  1363.     );
  1364.  
  1365.     fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  1366.   }
  1367.  
  1368.   //
  1369.   //  service methods
  1370.   //
  1371.  
  1372.   //
  1373.   //  creates a text control with the given text in one line
  1374.   //  centered on the screen, returns the bottom y coord of the
  1375.   //  control
  1376.   //
  1377.  
  1378.   float CenterText(string _text, float _y, string _id2)
  1379.   {
  1380.     return CenterText(_text, _y, _id2, color(1.0, 1.0, 1.0, 1.0));
  1381.   }
  1382.  
  1383.   float CenterText(string _text, float _y, string _id1, color _color)
  1384.   {
  1385.     float  fWidth  = GetTextWidth(_text);
  1386.     float  fHeight = GetTextHeight(_text);
  1387.  
  1388.     CreateTextControl(
  1389.       _text,
  1390.       _id1,
  1391.       (1.0 - fWidth) / 2,
  1392.       _y,
  1393.       fWidth,
  1394.       fHeight,
  1395.       _color
  1396.     );
  1397.  
  1398.     return _y + fHeight;
  1399.   }
  1400.  
  1401.   float CenterTextMultiLine(
  1402.           string _text,
  1403.           float  _y,
  1404.           string _id,
  1405.           color  _color,
  1406.           int    _lines)
  1407.   {
  1408.     float  fWidth  = GetTextWidth(_text);
  1409.     float  fHeight = GetTextHeight(_text) * _lines;
  1410.  
  1411.     CreateTextControl(
  1412.       _text,
  1413.       _id,
  1414.       (1.0 - fWidth) / 2,
  1415.       _y,
  1416.       fWidth,
  1417.       fHeight,
  1418.       _color
  1419.     );
  1420.  
  1421.     return _y + fHeight;
  1422.   }
  1423.  
  1424.   //
  1425.   //  Mission status screen
  1426.   //
  1427.  
  1428.   array  m_MissionObjectives;
  1429.   array  m_MissionObjectivesStatuses;
  1430.   array  m_BonusMissionObjectives;
  1431.   array  m_BonusMissionObjectivesStatuses;
  1432.   string m_MissionStatistics;
  1433.   bool   m_bInGame;
  1434.   bool   m_bMissionComplete;
  1435.  
  1436.   void BaseMenu_SetMissionStatus(
  1437.           array  _objectives,
  1438.           array  _statuses,
  1439.           array  _bonus_objectives,
  1440.           array  _bonus_statuses,
  1441.           string _statistics,
  1442.           bool   _in_game,
  1443.           bool   _mission_complete)
  1444.   {
  1445.     m_MissionObjectives              = _objectives;
  1446.     m_MissionObjectivesStatuses      = _statuses;
  1447.     m_BonusMissionObjectives         = _bonus_objectives;
  1448.     m_BonusMissionObjectivesStatuses = _bonus_statuses;
  1449.     m_MissionStatistics              = _statistics;
  1450.     m_bInGame                        = _in_game;
  1451.     m_bMissionComplete               = _mission_complete;
  1452.  
  1453.     if (!_in_game)
  1454.     {
  1455.       // replace 'In progress' statuses with 'Failed'
  1456.       for (int i = 0; i < m_MissionObjectivesStatuses.size(); i = i + 1)
  1457.         if (m_MissionObjectivesStatuses[i] == str_ObjectiveInProgress)
  1458.           m_MissionObjectivesStatuses[i] = str_ObjectiveFailed;
  1459.  
  1460.       for (int i = 0; i < m_BonusMissionObjectivesStatuses.size(); i = i + 1)
  1461.         if (m_BonusMissionObjectivesStatuses[i] == str_ObjectiveInProgress)
  1462.           m_BonusMissionObjectivesStatuses[i] = str_ObjectiveFailed;
  1463.     }
  1464.   }
  1465.  
  1466.   bool   m_bFinishMissionEnabled = false;
  1467.  
  1468.   void BaseMenu_EnableFinishMission()
  1469.   {
  1470.     m_bFinishMissionEnabled = true;
  1471.   }
  1472.  
  1473.   void BaseMenu_ShowMissionStatus()
  1474.   {
  1475.     //
  1476.     //  Background
  1477.     //
  1478.  
  1479.     if (!m_bInGame)
  1480.     {
  1481.       string strBackground;
  1482.  
  1483.       if (m_bMissionComplete)
  1484.         strBackground = "Resources/Menu_Mission_Complete.tex";
  1485.       else
  1486.         strBackground = "Resources/Menu_Mission_Failed.tex";
  1487.  
  1488.       CreateBitmapControl(
  1489.         strBackground,
  1490.         "ID_BITMAP",
  1491.         0.0,
  1492.         0.0,
  1493.         1.0,
  1494.         1.0
  1495.       );
  1496.     }
  1497.  
  1498.     color ScreenTitleColor  = color(1.0, 1.0, 1.0);
  1499.     color TitleColor        = color(0.7, 0.7, 0.7);
  1500.     color TextColor         = color(0.88, 0.43, 0.32);
  1501.     color StatusColor       = color(0.0, 0.7, 0.0);
  1502.     color FailedStatusColor = color(1.0, 0.0, 0.0);
  1503.     color InProgressColor   = color(0.7, 0.7, 0.0);
  1504.  
  1505.     float fSectionSpacing   = 0.05;
  1506.     float fObjectiveSpacing = 0.02;
  1507.  
  1508.     //
  1509.     //  Title
  1510.     //
  1511.  
  1512.     string strTitle;
  1513.     if (m_bInGame)
  1514.       strTitle = str_MissionStatusTitle;
  1515.     else
  1516.       strTitle = "";
  1517.  
  1518.     float fObjectivesY =
  1519.       CenterText(strTitle, 0.1, "ID_TITLE_TEXT", ScreenTitleColor);
  1520.  
  1521.     fObjectivesY = fObjectivesY + fSectionSpacing;
  1522.  
  1523.     //
  1524.     //  "Objectives"
  1525.     //
  1526.  
  1527.     fObjectivesY =
  1528.       CenterText(str_ObjectivesTitle, fObjectivesY, "ID_OBJECTIVES_TEXT", TitleColor);
  1529.  
  1530.     fObjectivesY = fObjectivesY + fObjectiveSpacing;
  1531.  
  1532.     //
  1533.     //  Objectives description
  1534.     //
  1535.  
  1536.     float fObjectiveHeight  = 0.05;
  1537.     float fObjectiveWidth   = 0.7 - fObjectiveSpacing * 2;
  1538.     float fStatusWidth      = 0.3 - fObjectiveSpacing * 2;
  1539.  
  1540.     for (int i = 0; i < m_MissionObjectives.size(); i = i + 1)
  1541.     {
  1542.       CreateTextControl(
  1543.         m_MissionObjectives[i],
  1544.         "ID_OBJECTIVE_DESCRIPTION" + i,
  1545.         fObjectiveSpacing,
  1546.         fObjectivesY + i * (fObjectiveHeight + fObjectiveSpacing),
  1547.         fObjectiveWidth,
  1548.         fObjectiveHeight,
  1549.         TextColor
  1550.       );
  1551.     }
  1552.  
  1553.     //
  1554.     //  Objectives' satuses
  1555.     //
  1556.  
  1557.     for (int i = 0; i < m_MissionObjectivesStatuses.size(); i = i + 1)
  1558.     {
  1559.       color status_color = StatusColor;
  1560.       if (m_MissionObjectivesStatuses[i] == str_ObjectiveFailed)
  1561.         status_color = FailedStatusColor;
  1562.       if (m_MissionObjectivesStatuses[i] == str_ObjectiveInProgress)
  1563.         status_color = InProgressColor;
  1564.  
  1565.       CreateTextControl(
  1566.         m_MissionObjectivesStatuses[i],
  1567.         "ID_OBJECTIVE_STATUS" + i,
  1568.         fObjectiveWidth + fObjectiveSpacing * 2,
  1569.         fObjectivesY + i * (fObjectiveHeight + fObjectiveSpacing),
  1570.         fStatusWidth,
  1571.         fObjectiveHeight,
  1572.         status_color
  1573.       );
  1574.     }
  1575.  
  1576.     //
  1577.     //  Bonus objectives description
  1578.     //
  1579.  
  1580.     float fBonusY;
  1581.  
  1582.     fBonusY =
  1583.       fObjectivesY + fSectionSpacing +
  1584.         + m_MissionObjectivesStatuses.size()
  1585.           * (fObjectiveHeight + fObjectiveSpacing);
  1586.  
  1587.     if (m_BonusMissionObjectives.size() > 0)
  1588.     {
  1589.  
  1590.       //
  1591.       //  "Bonus Objectives"
  1592.       //
  1593.  
  1594.       fBonusY =
  1595.         CenterText(str_BonusObjectivesTitle, fBonusY, "ID_BONUS_OBJECTIVES_TEXT", TitleColor);
  1596.  
  1597.       fBonusY = fBonusY + fObjectiveSpacing;
  1598.  
  1599.       for (int i = 0; i < m_BonusMissionObjectives.size(); i = i + 1)
  1600.       {
  1601.         CreateTextControl(
  1602.           m_BonusMissionObjectives[i],
  1603.           "ID_BONUS_OBJECTIVE_DESCRIPTION" + i,
  1604.           fObjectiveSpacing,
  1605.           fBonusY + i * (fObjectiveHeight + fObjectiveSpacing),
  1606.           fObjectiveWidth,
  1607.           fObjectiveHeight,
  1608.           TextColor
  1609.         );
  1610.       }
  1611.  
  1612.       //
  1613.       //  Bonus objectives statuses
  1614.       //
  1615.  
  1616.       for (int i = 0; i < m_BonusMissionObjectivesStatuses.size(); i = i + 1)
  1617.       {
  1618.         color status_color = StatusColor;
  1619.         if (m_BonusMissionObjectivesStatuses[i] == str_ObjectiveFailed)
  1620.           status_color = FailedStatusColor;
  1621.         if (m_BonusMissionObjectivesStatuses[i] == str_ObjectiveInProgress)
  1622.           status_color = InProgressColor;
  1623.  
  1624.         CreateTextControl(
  1625.           m_BonusMissionObjectivesStatuses[i],
  1626.           "ID_BONUS_OBJECTIVE_STATUS" + i,
  1627.           fObjectiveWidth + fObjectiveSpacing * 2,
  1628.           fBonusY + i * (fObjectiveHeight + fObjectiveSpacing),
  1629.           fStatusWidth,
  1630.           fObjectiveHeight,
  1631.           status_color
  1632.         );
  1633.       }
  1634.     }
  1635.  
  1636.     if (m_MissionStatistics != "")
  1637.     {
  1638.  
  1639.       //
  1640.       //  "Mission information"
  1641.       //
  1642.  
  1643.       float fInfoY =
  1644.         fBonusY + fSectionSpacing +
  1645.           + m_BonusMissionObjectivesStatuses.size()
  1646.             * (fObjectiveHeight + fObjectiveSpacing);
  1647.  
  1648.       fInfoY =
  1649.         CenterText(str_MissionInfoTitle, fInfoY, "ID_MISSION_INFO_TEXT", TitleColor);
  1650.  
  1651.       fInfoY = fInfoY + fObjectiveSpacing;
  1652.  
  1653.       //
  1654.       //  Text control with statistics
  1655.       //
  1656.  
  1657.       CenterTextMultiLine(
  1658.         m_MissionStatistics,
  1659.         fInfoY,
  1660.         "ID_MISSION_STATISTICS",
  1661.         TextColor,
  1662.         2
  1663.       );
  1664.     }
  1665.  
  1666.     //
  1667.     //  OK button
  1668.     //
  1669.  
  1670.     CreateMenuButtonGroup(MenuWidth, MenuSpacing);
  1671.  
  1672.     float fSpacing      = 0.05;
  1673.     float fButtonX      = (1.0 - fButtonWidth * 2 - fSpacing) / 2;
  1674.     float fButtonY      = 1.0 - fButtonHeight - 0.05;
  1675.  
  1676.     string OkButtonTitle;
  1677.  
  1678.     if (!m_bInGame)
  1679.       OkButtonTitle = str_ExitDebriefing;
  1680.     else
  1681.       OkButtonTitle = str_Continue;
  1682.  
  1683.     CreateTextButton(
  1684.       OkButtonTitle,
  1685.       "ID_MISSION_STATUS_OK",
  1686.       fButtonX,
  1687.       fButtonY,
  1688.       fButtonWidth,
  1689.       fButtonHeight);
  1690.  
  1691.     fButtonX = fButtonX + fButtonWidth + fSpacing;
  1692.  
  1693.     if (!m_bInGame)
  1694.     {
  1695.       CreateTextButton(
  1696.         str_RestartMissionButton,
  1697.         "ID_RESTART_MISSION",
  1698.         fButtonX,
  1699.         fButtonY,
  1700.         fButtonWidth,
  1701.         fButtonHeight);
  1702.  
  1703.       fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  1704.     }
  1705.     else
  1706.     {
  1707.       CreateTextButton(
  1708.         str_FinishMission,
  1709.         "ID_FINISH_MISSION",
  1710.         fButtonX,
  1711.         fButtonY,
  1712.         fButtonWidth,
  1713.         fButtonHeight,
  1714.         m_bFinishMissionEnabled);
  1715.  
  1716.       fButtonY = fButtonY + fButtonHeight + fVertSpacing;
  1717.     }
  1718.   }
  1719.  
  1720.   //
  1721.   //  HelpScreen
  1722.   //
  1723.  
  1724.   void BaseMenu_ShowMissionHelpScreen()
  1725.   {
  1726.     color TitleColor       = color(0.7, 0.7, 0.7, 1.0);
  1727.     color TextColor        = color(0.0, 0.7, 0.7, 1.0);
  1728.  
  1729.     //
  1730.     //  Title
  1731.     //
  1732.  
  1733.     float fSpacing = 0.05;
  1734.  
  1735.     float fY =
  1736.       CenterText(str_HelpTitle, fSpacing, "ID_TITLE_TEXT", TitleColor);
  1737.  
  1738.     float fTextHeight = fY - fSpacing;
  1739.  
  1740.     float fHelpTextY = fY + fSpacing;
  1741.     float fHelpTextX = fSpacing;
  1742.     float fHelpTextWidth = 1.0 - fSpacing * 2;
  1743.     float fHelpTextHeight = 1.0 - fSpacing * 4 - fButtonHeight - fTextHeight;
  1744.  
  1745.     CreateTextControl(
  1746.       LoadTextFromFile("Resources/Help.txt"),
  1747.       "ID_HELP_TEXT",
  1748.       fHelpTextX,
  1749.       fHelpTextY,
  1750.       fHelpTextWidth,
  1751.       fHelpTextHeight,
  1752.       TextColor
  1753.     );
  1754.  
  1755.     //
  1756.     //  OK button
  1757.     //
  1758.  
  1759.     CreateMenuButtonGroup(MenuWidth, MenuSpacing);
  1760.  
  1761.     float fButtonX      = (1.0 - fButtonWidth) / 2;
  1762.     float fButtonY      = 1.0 - fButtonHeight - fSpacing;
  1763.  
  1764.     CreateTextButton(
  1765.       str_OkButton,
  1766.       "ID_MISSION_HELP_SCREEN_OK",
  1767.       fButtonX,
  1768.       fButtonY,
  1769.       fButtonWidth,
  1770.       fButtonHeight);
  1771.   }
  1772.  
  1773. };
  1774.